package com.threeox.ormlibrary.inter;

import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;

import java.util.List;

/**
 *
 * @ClassName: ISqlExecutor
 *
 * @Description: Todo(SQL执行器接口)
 *
 * @author 赵屈犇
 *
 * @date 创建时间:2017/4/25 下午11:51
 *
 * @version 1.0
 */
public interface ISqlExecutor {

	/**
	 * 开启事物的函数
	 *
	 * @return
     */
	ISqlExecutor beginTransaction();

	/**
	 * 事物标记成功
	 *
	 * @return
	 */
	ISqlExecutor setTransactionSuccessful();

	/**
	 * 提交或回滚事务
	 *
	 * @return
	 */
	ISqlExecutor endTransaction();

	/**
	 * 动态执行Sql
	 *
	 * @param sql
	 * @param bindArgs
     *
     * @return  null 代表成功   其他代表失败
	 */
	Exception executeSql(String sql, Object... bindArgs);

	/**
	 * 根据对象保存数据
	 *
	 * @param data
	 * @param tableName
     * @return
     */
	Long save(Object data, String tableName);

	/**
	 * 根据集合对象保存数据
	 *
	 * @param datas
	 * @param tableName
	 * @return
	 */
	List<Long> saveList(List datas, String tableName);

	/**
	 * 删除所有表数据
	 *
	 * @param tableName
	 * @return
     */
	Integer deleteAll(String tableName);

	/**
	 * 删除指定条件数据
	 *
	 * @param tableName
	 * @param whereClause
	 * @param whereArgs
     * @return
     */
	Integer delete(String tableName, String whereClause, String... whereArgs);

	/**
	 * 更新表数据
	 *
	 * @param tableName
	 * @param data
	 * @param whereClause
	 * @param whereArgs
	 * @return
	 */
	Integer update(String tableName, Object data, String whereClause, String... whereArgs);

	/**
	 * 更新表数据
	 *
	 * @param tableName
	 * @param values
	 * @param whereClause
	 * @param whereArgs
     * @return
     */
	Integer update(String tableName, ContentValues values, String whereClause, String... whereArgs);

	/**
	 * 根据sql查询集合
	 *
	 * @param sql
	 * @param clazz
	 * @param selectionArgs
	 * @return
	 *
	 * @throws Exception
	 */
	<T> List<T> queryList(String sql, Class clazz, String... selectionArgs);

	/**
	 * 根据sql查询单个对象
	 * 
	 * @param sql
	 * @param clazz
	 * @param selectionArgs
	 * @return
	 * 
	 * @throws Exception
	 */
	<T> T query(String sql, Class clazz, String... selectionArgs);

	/**
	 * 统计记录数量
	 * 
	 * @param sql
	 * @return
	 * 
	 * @throws Exception
	 */
	Long queryCount(String sql, String... selectionArgs);


	/**
	 * 设置操作数据源
	 *
	 * @param db
	 * @return
     */
	ISqlExecutor setSQLiteDatabase(SQLiteDatabase db);

	/**
	 * 设置执行SQL的回调监听
	 *
	 * @param mSqlListener
	 * @return
	 */
	ISqlExecutor setOnSqlListener(OnSqlListener mSqlListener);

	/**
	 * 设置查询单条数据回调
	 *
	 * @param queryListener
	 * @return
	 */
	ISqlExecutor setOnQueryListener(OnQueryListener queryListener);

	/**
	 * 设置查询多条数据回调
	 *
	 * @param queryListListener
	 * @return
     */
	ISqlExecutor setOnQueryListListener(OnQueryListListener queryListListener);

}
